package com.king.juc.atomicdemo.account;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * 保护共享资源: 无锁安全案例
 *      AtomicInteger
 * CAS特点:
 *      结合 CAS 和 volatile 可以实现无锁并发, 适用于线程数少, 多核CPU的场景下
 *          CAS 是基于乐观锁思想: 最乐观的估计, 不怕别的线程来修改共享变量, 就算改了也没关系, 再重试即可
 *          synchronized 是基于悲观锁的思想: 最悲观的估计, 得防着其他线程来修改共享变量, 需要解锁后别的线程才能使用
 *          CAS 体现的是无锁并发, 无阻塞并发
 *              因为没有使用synchronized, 所以线程不会线路阻塞, 这是效率提升的因素之一
 *              但如果竞争激烈, 可以想到重试必然频繁发生, 反而效率会受影响
 * @author king
 * @date 2020/11/29 16:53
 */
public class AccountCas implements Account {

    private AtomicInteger balance;

    public AccountCas(Integer balance) {
        this.balance = new AtomicInteger(balance);
    }

    @Override
    public Integer getBalance() {
        return balance.get();
    }

    @Override
    public void withdraw(Integer amount) {
        balance.getAndAdd(-amount);
//        while(true) {
//            // 获取余额的最新值
//            int prev = balance.get();
//            // 要修改的余额
//            int next = prev - 10;
//            // 真正修改
//            if (balance.compareAndSet(prev, next)) {
//                break;
//            }
//        }
    }
}
